﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;

namespace FileSharing
{
    public class Usuario : Node
    {
        private Main MainForm;

        protected Diretorio DiretorioAtivo = new Diretorio();

        private ProtocolHandler Protocol = new ProtocolHandler();

        public Usuario(Main main)
        {
            MainForm = main;
        }

        public override string Name
        {
            get { return Protocol.LocalName; }
        }

        public override IPEndPoint IP
        {
            get { return Protocol.LocalAddress; }
        }

        public String Diretorio
        {
            get { return DiretorioAtivo.Location; }
            set { DiretorioAtivo.Location = value; }
        }

        public int FilesCount
        {
            get { return DiretorioAtivo.FilesCount; }
        }

        public void Connect()
        {
            Protocol.Start(DiretorioAtivo);
        }

        public void Connect(Vizinho[] users)
        {
            Protocol.Start(users, DiretorioAtivo);
        }

        public void Disconnect()
        {
            Protocol.Stop();
        }

        public void Vizinhos(out List<Vizinho> Conhecidos, out List<Connection> Conectados)
        {
            Conhecidos = Protocol.ListaConhecidos;
            Conectados = Protocol.ListaConectados;
        }

        public void ProtocolConnected()
        {
            MainForm.ProtocolConnected();
        }

        public void StartSearch(String query)
        {
            Protocol.ClearSearchResults();
            Protocol.SendSearch(query);
        }

        public RemoteFile[] SearchResults()
        {
            return Protocol.SearchResults;
        }

        public void StartDownload(RemoteFile[] sources)
        {
            Protocol.StartDownload(sources);
        }

        public TransfersCollection GetTransfersCollection()
        {
            return Protocol.GetTransfers();
        }

        public bool FileExists(byte[] hash, long size)
        {
            try
            {
                DiretorioAtivo.FindFile(hash, size);
                return true;
            }
            catch (FileNotFoundException e)
            {
                return false;
            }
        }
    }
}
